//从指定贴吧获取帖子地址，作者，题目，插入数据库
//采用递归和迭代器来获取每一个帖子项，并插入数据库，只有插入成功之后才获取下一个帖子，
//全部获取之后再获取下一页的内容。
//这样避免了获取一页内容并解析之后一下子发送大量request造成堵塞的情况，大大降低了数据插入失败的可能性。


//使用request来获取数据，插入mysql
var request = require('request');
//使用cheerio来解析html
var cheerio = require('cheerio');
//贴吧的url，直接从浏览器地址栏里复制即可，此处为锤子科技贴吧，帮罗老师赢!!   XD
var tiebaUrl = 'http://tieba.baidu.com/f?kw=%E9%94%A4%E5%AD%90%E7%A7%91%E6%8A%80&ie=utf-8&apage=1&pn=';
//数据库url
var dbUrl = "http://www.yourbase.com/index.php?act=insert";
//保存当前pageid
var currentPage = 1800;
//贴吧最大pageid
var END_PAGE = 43000;
//迭代器，用于指向一个页面的帖子
var iter;


//程序开始
getPage();


//获取页面的函数
function getPage() {
    if (currentPage > END_PAGE) {
        return;
    }
    request(tiebaUrl + currentPage, function (err, resp, body) {
        if (err) {
            getPage(); // 如果获取失败，则重新获取
        } else {
            //成功，则进行处理，显示当前页
            console.log("currentPage : " + currentPage);
            currentPage = currentPage + 50;
            iter = item(body);
            getItem(0);
        }
    });

}

//迭代器
function * item(body) {
    $ = cheerio.load(body);
    var page = $('div.threadlist_lz');
    for (var i = 0; i < page.length; i++) {
        if ($(page[i]).find('a.j_th_tit').attr('title') == null) {
            continue; //略过置顶帖里的title因为置顶帖里的a的class不是j_th_tit所以无法返回title
        } else {
            var title = $(page[i]).find('a.j_th_tit').attr('title');
            var href = $(page[i]).find('a.j_th_tit').attr('href');
            var author = $(page[i]).find('span.tb_icon_author').attr('title').substring(6);
            //var author_id = $(page[i]).find("span.tb_icon_author").attr("data-field");
            yield "title=" + title + "&href=" + href + "&author=" + author;// + "&author_id=" + author_id;
        }
    }
}

//
function getItem(inputStr) {
    if (inputStr != 0) {  //出错则重新插入
        request(inputStr, function (err, resp, body) {
            if (err) {
                getItem(insertUrl); //出错则重新插入
            } else {
                getItem(0);
            }
        });
    } else {    //没有出错则继续下一个
        var o = iter.next();
        if (o.done == false) {
            console.log(o.value);
            //注：nodejs可以不用加encodeURI，似乎会对中文自动转换，iojs必须加上encodeURI
            var insertUrl = encodeURI(dbUrl + o.value);
            request(insertUrl, function (err, resp, body) {
                if (err) {
                    getItem(insertUrl);
                } else {
                    getItem(0);
                }
            });
        } else {
            //console.log("end");
            getPage();
        }
    }
};